home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1999 #2 / Amiga Plus CD - 1999 - No. 2.iso / System-Boost / Workbench / ToolManager / Source / Prefs / mainwindow.c < prev    next >
C/C++ Source or Header  |  1998-06-17  |  26KB  |  686 lines

  1. /*
  2.  * mainwindow.c  V3.1
  3.  *
  4.  * Main window class
  5.  *
  6.  * Copyright (C) 1990-98 Stefan Becker
  7.  *
  8.  * This source code is for educational purposes only. You may study it
  9.  * and copy ideas or algorithms from it for your own projects. It is
  10.  * not allowed to use any of the source codes (in full or in parts)
  11.  * in other programs. Especially it is not allowed to create variants
  12.  * of ToolManager or ToolManager-like programs from this source code.
  13.  *
  14.  */
  15.  
  16. #include "toolmanager.h"
  17.  
  18. /* Local data */
  19. static const char *TextObjects[TMOBJTYPES + 1];
  20.  
  21. /* Menu ids */
  22. enum { MENUID_OPEN      = 1000,
  23.        MENUID_APPEND,
  24.        MENUID_SAVEAS,
  25.        MENUID_CLIPBOARD,
  26.        MENUID_ABOUT,
  27.        MENUID_ABOUTMUI,
  28.        MENUID_QUIT,
  29.        MENUID_LASTSAVED,
  30.        MENUID_RESTORE,
  31.        MENUID_GLOBAL,
  32.        MENUID_MUI
  33. };
  34.  
  35. /* MainWindow class instance data */
  36. struct MainWindowClassData {
  37.  Object     *mwcd_Icons;
  38.  Object     *mwcd_Register;
  39.  Object     *mwcd_Lists[TMOBJTYPES];
  40.  const char *mwcd_DefaultFile;
  41. };
  42. #define TYPED_INST_DATA(cl, o) ((struct MainWindowClassData *) INST_DATA((cl), (o)))
  43.  
  44. /* MainWindow class method: OM_NEW */
  45. #undef  DEBUGFUNCTION
  46. #define DEBUGFUNCTION MainWindowClassNew
  47. static ULONG MainWindowClassNew(Class *cl, Object *obj, struct opSet *ops)
  48. {
  49.  char   *file;
  50.  Object *rc   = NULL;
  51.  
  52.  /* Duplicate default file name */
  53.  if (file = DuplicateString("SYS:Prefs/Presets/" TMCONFIGNAME)) {
  54.   Object *Icons;
  55.   Object *Register;
  56.   Object *SaveButton;
  57.   Object *UseButton;
  58.   Object *TestButton;
  59.   Object *CancelButton;
  60.   Object *Lists[TMOBJTYPES];
  61.  
  62.   MAINWINDOW_LOG((LOG1(Tags, "0x%08lx", ops->ops_AttrList),
  63.                   PrintTagList(ops->ops_AttrList)))
  64.  
  65.   if (rc = (Object *) DoSuperNew(cl, obj,
  66.        MUIA_Window_Title,     TextGlobalTitle,
  67.        MUIA_Window_ID,        MAKE_ID('M','A','I','N'),
  68.        MUIA_Window_AppWindow, TRUE,
  69.        MUIA_Window_Menustrip, MenustripObject,
  70.         MUIA_Family_Child, MenuObject,
  71.          MUIA_Menu_Title,  TranslateString(
  72.                     LOCALE_TEXT_MAINWINDOW_MENU_PROJECT_TITLE_STR,
  73.                     LOCALE_TEXT_MAINWINDOW_MENU_PROJECT_TITLE),
  74.          MUIA_Family_Child,       MenuitemObject,
  75.           MUIA_Menuitem_Title,    TranslateString(
  76.                     LOCALE_TEXT_MAINWINDOW_MENU_PROJECT_OPEN_STR,
  77.                     LOCALE_TEXT_MAINWINDOW_MENU_PROJECT_OPEN),
  78.           MUIA_Menuitem_Shortcut, TranslateString(
  79.                     LOCALE_TEXT_MAINWINDOW_MENU_PROJECT_OPEN_SHORTCUT_STR,
  80.                     LOCALE_TEXT_MAINWINDOW_MENU_PROJECT_OPEN_SHORTCUT),
  81.           MUIA_UserData,          MENUID_OPEN,
  82.          End,
  83.          MUIA_Family_Child,       MenuitemObject,
  84.           MUIA_Menuitem_Title,    TranslateString(
  85.                     LOCALE_TEXT_MAINWINDOW_MENU_PROJECT_APPEND_STR,
  86.                     LOCALE_TEXT_MAINWINDOW_MENU_PROJECT_APPEND),
  87.           MUIA_UserData,          MENUID_APPEND,
  88.          End,
  89.          MUIA_Family_Child,       MenuitemObject,
  90.           MUIA_Menuitem_Title,    TranslateString(
  91.                     LOCALE_TEXT_MAINWINDOW_MENU_PROJECT_SAVEAS_STR,
  92.                     LOCALE_TEXT_MAINWINDOW_MENU_PROJECT_SAVEAS),
  93.           MUIA_Menuitem_Shortcut, TranslateString(
  94.                     LOCALE_TEXT_MAINWINDOW_MENU_PROJECT_SAVEAS_SHORTCUT_STR,
  95.                     LOCALE_TEXT_MAINWINDOW_MENU_PROJECT_SAVEAS_SHORTCUT),
  96.           MUIA_UserData,          MENUID_SAVEAS,
  97.          End,
  98.          MUIA_Family_Child,       MenuitemObject,
  99.           MUIA_Menuitem_Title,    NM_BARLABEL,
  100.          End,
  101.          MUIA_Family_Child,       MenuitemObject,
  102.           MUIA_Menuitem_Title,    TranslateString(
  103.                     LOCALE_TEXT_MAINWINDOW_MENU_PROJECT_CLIPBOARD_STR,
  104.                     LOCALE_TEXT_MAINWINDOW_MENU_PROJECT_CLIPBOARD),
  105.           MUIA_Menuitem_Shortcut, TranslateString(
  106.                     LOCALE_TEXT_MAINWINDOW_MENU_PROJECT_CLIPBOARD_SHORTCUT_STR,
  107.                     LOCALE_TEXT_MAINWINDOW_MENU_PROJECT_CLIPBOARD_SHORTCUT),
  108.           MUIA_UserData,          MENUID_CLIPBOARD,
  109.          End,
  110.          MUIA_Family_Child,       MenuitemObject,
  111.           MUIA_Menuitem_Title,    NM_BARLABEL,
  112.          End,
  113.          MUIA_Family_Child,       MenuitemObject,
  114.           MUIA_Menuitem_Title,    TranslateString(
  115.                     LOCALE_TEXT_MAINWINDOW_MENU_PROJECT_ABOUT_STR,
  116.                     LOCALE_TEXT_MAINWINDOW_MENU_PROJECT_ABOUT),
  117.           MUIA_UserData,          MENUID_ABOUT,
  118.          End,
  119.          MUIA_Family_Child,       MenuitemObject,
  120.           MUIA_Menuitem_Title,    TranslateString(
  121.                     LOCALE_TEXT_MAINWINDOW_MENU_PROJECT_ABOUT_MUI_STR,
  122.                     LOCALE_TEXT_MAINWINDOW_MENU_PROJECT_ABOUT_MUI),
  123.           MUIA_UserData,          MENUID_ABOUTMUI,
  124.          End,
  125.          MUIA_Family_Child,       MenuitemObject,
  126.           MUIA_Menuitem_Title,    NM_BARLABEL,
  127.          End,
  128.          MUIA_Family_Child,       MenuitemObject,
  129.           MUIA_Menuitem_Title,    TranslateString(
  130.                     LOCALE_TEXT_MAINWINDOW_MENU_PROJECT_QUIT_STR,
  131.                     LOCALE_TEXT_MAINWINDOW_MENU_PROJECT_QUIT),
  132.           MUIA_Menuitem_Shortcut, TranslateString(
  133.                     LOCALE_TEXT_MAINWINDOW_MENU_PROJECT_QUIT_SHORTCUT_STR,
  134.                     LOCALE_TEXT_MAINWINDOW_MENU_PROJECT_QUIT_SHORTCUT),
  135.           MUIA_UserData,          MENUID_QUIT,
  136.          End,
  137.         End,
  138.         MUIA_Family_Child, MenuObject,
  139.          MUIA_Menu_Title,  TranslateString(
  140.                     LOCALE_TEXT_MAINWINDOW_MENU_EDIT_TITLE_STR,
  141.                     LOCALE_TEXT_MAINWINDOW_MENU_EDIT_TITLE),
  142.          MUIA_Family_Child,       MenuitemObject,
  143.           MUIA_Menuitem_Title,    TranslateString(
  144.                     LOCALE_TEXT_MAINWINDOW_MENU_EDIT_LASTSAVED_STR,
  145.                     LOCALE_TEXT_MAINWINDOW_MENU_EDIT_LASTSAVED),
  146.           MUIA_Menuitem_Shortcut, TranslateString(
  147.                     LOCALE_TEXT_MAINWINDOW_MENU_EDIT_LASTSAVED_SHORTCUT_STR,
  148.                     LOCALE_TEXT_MAINWINDOW_MENU_EDIT_LASTSAVED_SHORTCUT),
  149.           MUIA_UserData,          MENUID_LASTSAVED,
  150.          End,
  151.          MUIA_Family_Child,       MenuitemObject,
  152.           MUIA_Menuitem_Title,    TranslateString(
  153.                     LOCALE_TEXT_MAINWINDOW_MENU_EDIT_RESTORE_STR,
  154.                     LOCALE_TEXT_MAINWINDOW_MENU_EDIT_RESTORE),
  155.           MUIA_Menuitem_Shortcut, TranslateString(
  156.                     LOCALE_TEXT_MAINWINDOW_MENU_EDIT_RESTORE_SHORTCUT_STR,
  157.                     LOCALE_TEXT_MAINWINDOW_MENU_EDIT_RESTORE_SHORTCUT),
  158.           MUIA_UserData,          MENUID_RESTORE,
  159.          End,
  160.         End,
  161.         MUIA_Family_Child,  MenuObject,
  162.          MUIA_Menu_Title,   TranslateString(
  163.                     LOCALE_TEXT_MAINWINDOW_MENU_SETTINGS_TITLE_STR,
  164.                     LOCALE_TEXT_MAINWINDOW_MENU_SETTINGS_TITLE),
  165.          MUIA_Family_Child, Icons = MenuitemObject,
  166.           MUIA_Menuitem_Title,    TranslateString(
  167.                     LOCALE_TEXT_MAINWINDOW_MENU_SETTINGS_ICONS_STR,
  168.                     LOCALE_TEXT_MAINWINDOW_MENU_SETTINGS_ICONS),
  169.           MUIA_Menuitem_Shortcut, TranslateString(
  170.                     LOCALE_TEXT_MAINWINDOW_MENU_SETTINGS_ICONS_SHORTCUT_STR,
  171.                     LOCALE_TEXT_MAINWINDOW_MENU_SETTINGS_ICONS_SHORTCUT),
  172.           MUIA_Menuitem_Checkit,  TRUE,
  173.           MUIA_Menuitem_Checked,  CreateIcons,
  174.          End,
  175.          MUIA_Family_Child,       MenuitemObject,
  176.           MUIA_Menuitem_Title,    NM_BARLABEL,
  177.          End,
  178.          MUIA_Family_Child,       MenuitemObject,
  179.           MUIA_Menuitem_Title,    TranslateString(
  180.                     LOCALE_TEXT_MAINWINDOW_MENU_SETTINGS_GLOBAL_STR,
  181.                     LOCALE_TEXT_MAINWINDOW_MENU_SETTINGS_GLOBAL),
  182.           MUIA_Menuitem_Shortcut, TranslateString(
  183.                     LOCALE_TEXT_MAINWINDOW_MENU_SETTINGS_GLOBAL_SHORTCUT_STR,
  184.                     LOCALE_TEXT_MAINWINDOW_MENU_SETTINGS_GLOBAL_SHORTCUT),
  185.           MUIA_UserData,          MENUID_GLOBAL,
  186.          End,
  187.          MUIA_Family_Child,       MenuitemObject,
  188.           MUIA_Menuitem_Title,    TranslateString(
  189.                     LOCALE_TEXT_MAINWINDOW_MENU_SETTINGS_MUI_STR,
  190.                     LOCALE_TEXT_MAINWINDOW_MENU_SETTINGS_MUI),
  191.           MUIA_Menuitem_Shortcut, TranslateString(
  192.                     LOCALE_TEXT_MAINWINDOW_MENU_SETTINGS_MUI_SHORTCUT_STR,
  193.                     LOCALE_TEXT_MAINWINDOW_MENU_SETTINGS_MUI_SHORTCUT),
  194.           MUIA_UserData,          MENUID_MUI,
  195.          End,
  196.         End,
  197.        End,
  198.        WindowContents, VGroup,
  199.         Child, Register = RegisterGroup(TextObjects),
  200.          MUIA_CycleChain, TRUE,
  201.          MUIA_ShortHelp,  TranslateString(LOCALE_HELP_MAINWINDOW_TYPES_STR,
  202.                                           LOCALE_HELP_MAINWINDOW_TYPES),
  203.          Child, Lists[TMOBJTYPE_EXEC] =
  204.                  NewObject(ListPanelClass->mcc_Class, NULL,
  205.                            TMA_Class,      ObjectClasses[TMOBJTYPE_EXEC],
  206.                            MUIA_ShortHelp, TranslateString(
  207.                                         LOCALE_HELP_MAINWINDOW_TYPE_EXEC_STR,
  208.                                         LOCALE_HELP_MAINWINDOW_TYPE_EXEC),
  209.                            TAG_DONE),
  210.          Child, Lists[TMOBJTYPE_IMAGE] =
  211.                  NewObject(ListPanelClass->mcc_Class, NULL,
  212.                            TMA_Class, ObjectClasses[TMOBJTYPE_IMAGE],
  213.                            MUIA_ShortHelp, TranslateString(
  214.                                         LOCALE_HELP_MAINWINDOW_TYPE_IMAGE_STR,
  215.                                         LOCALE_HELP_MAINWINDOW_TYPE_IMAGE),
  216.                            TAG_DONE),
  217.          Child, Lists[TMOBJTYPE_SOUND] =
  218.                  NewObject(ListPanelClass->mcc_Class, NULL,
  219.                            TMA_Class, ObjectClasses[TMOBJTYPE_SOUND],
  220.                            MUIA_ShortHelp, TranslateString(
  221.                                         LOCALE_HELP_MAINWINDOW_TYPE_SOUND_STR,
  222.                                         LOCALE_HELP_MAINWINDOW_TYPE_SOUND),
  223.                            TAG_DONE),
  224.          Child, Lists[TMOBJTYPE_MENU] =
  225.                  NewObject(ListPanelClass->mcc_Class, NULL,
  226.                            TMA_Class, ObjectClasses[TMOBJTYPE_MENU],
  227.                            MUIA_ShortHelp, TranslateString(
  228.                                         LOCALE_HELP_MAINWINDOW_TYPE_MENU_STR,
  229.                                         LOCALE_HELP_MAINWINDOW_TYPE_MENU),
  230.                            TAG_DONE),
  231.          Child, Lists[TMOBJTYPE_ICON] =
  232.                  NewObject(ListPanelClass->mcc_Class, NULL,
  233.                            TMA_Class, ObjectClasses[TMOBJTYPE_ICON],
  234.                            MUIA_ShortHelp, TranslateString(
  235.                                         LOCALE_HELP_MAINWINDOW_TYPE_ICON_STR,
  236.                                         LOCALE_HELP_MAINWINDOW_TYPE_ICON),
  237.                            TAG_DONE),
  238.          Child, Lists[TMOBJTYPE_DOCK] =
  239.                  NewObject(ListPanelClass->mcc_Class, NULL,
  240.                            TMA_Class, ObjectClasses[TMOBJTYPE_DOCK],
  241.                            MUIA_ShortHelp, TranslateString(
  242.                                         LOCALE_HELP_MAINWINDOW_TYPE_DOCK_STR,
  243.                                         LOCALE_HELP_MAINWINDOW_TYPE_DOCK),
  244.                            TAG_DONE),
  245.          Child, Lists[TMOBJTYPE_ACCESS] =
  246.                  NewObject(ListPanelClass->mcc_Class, NULL,
  247.                            TMA_Class, ObjectClasses[TMOBJTYPE_ACCESS],
  248.                            MUIA_ShortHelp, TranslateString(
  249.                                         LOCALE_HELP_MAINWINDOW_TYPE_ACCESS_STR,
  250.                                         LOCALE_HELP_MAINWINDOW_TYPE_ACCESS),
  251.                            MUIA_Disabled, TRUE,
  252.                            TAG_DONE),
  253.         End,
  254.         Child, HGroup,
  255.          MUIA_Group_SameWidth, TRUE,
  256.          Child, SaveButton =   MakeButton(TranslateString(
  257.                                              LOCALE_TEXT_MAINWINDOW_SAVE_STR,
  258.                                              LOCALE_TEXT_MAINWINDOW_SAVE),
  259.                                           TranslateString(
  260.                                              LOCALE_HELP_MAINWINDOW_SAVE_STR,
  261.                                              LOCALE_HELP_MAINWINDOW_SAVE)),
  262.          Child, HSpace(0),
  263.          Child, UseButton =    MakeButton(TextGlobalUse,
  264.                                           TranslateString(
  265.                                              LOCALE_HELP_MAINWINDOW_USE_STR,
  266.                                              LOCALE_HELP_MAINWINDOW_USE)),
  267.          Child, HSpace(0),
  268.          Child, TestButton =   MakeButton(TranslateString(
  269.                                              LOCALE_TEXT_MAINWINDOW_TEST_STR,
  270.                                              LOCALE_TEXT_MAINWINDOW_TEST),
  271.                                           TranslateString(
  272.                                              LOCALE_HELP_MAINWINDOW_TEST_STR,
  273.                                              LOCALE_HELP_MAINWINDOW_TEST)),
  274.          Child, HSpace(0),
  275.          Child, CancelButton = MakeButton(TextGlobalCancel,
  276.                                           TranslateString(
  277.                                              LOCALE_HELP_MAINWINDOW_CANCEL_STR,
  278.                                              LOCALE_HELP_MAINWINDOW_CANCEL)),
  279.         End,
  280.        End,
  281.        MUIA_HelpNode, "MainWindow",
  282.        TAG_MORE,      ops->ops_AttrList)) {
  283.    struct MainWindowClassData *mwcd = TYPED_INST_DATA(cl, rc);
  284.  
  285.    /* Initialize instance data */
  286.    mwcd->mwcd_Icons    = Icons;
  287.    mwcd->mwcd_Register = Register;
  288.  
  289.    /* Copy lists */
  290.    {
  291.     int i;
  292.  
  293.     for (i = TMOBJTYPE_EXEC; i < TMOBJTYPES; i++)
  294.      mwcd->mwcd_Lists[i] = Lists[i];
  295.    }
  296.  
  297.    /* Set default file name */
  298.    mwcd->mwcd_DefaultFile = file;
  299.  
  300.    /* Close window action */
  301.    DoMethod(rc, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
  302.             rc, 2, TMM_Finish, TMV_Finish_Cancel);
  303.  
  304.    /* Menu action */
  305.    DoMethod(rc, MUIM_Notify, MUIA_Window_MenuAction, MUIV_EveryTime,
  306.             rc, 2, TMM_Menu, MUIV_TriggerValue);
  307.  
  308.    /* AppWindow action */
  309.    DoMethod(rc, MUIM_Notify, MUIA_AppMessage, MUIV_EveryTime,
  310.             rc, 3, MUIM_CallHook, &AppMessageHook, MUIV_TriggerValue);
  311.  
  312.    /* Button actions */
  313.    DoMethod(SaveButton,   MUIM_Notify, MUIA_Pressed, FALSE,
  314.             rc, 2, TMM_Finish, TMV_Finish_Save);
  315.    DoMethod(UseButton,    MUIM_Notify, MUIA_Pressed, FALSE,
  316.             rc, 2, TMM_Finish, TMV_Finish_Use);
  317.    DoMethod(TestButton,   MUIM_Notify, MUIA_Pressed, FALSE,
  318.             rc, 2, TMM_Finish, TMV_Finish_Test);
  319.    DoMethod(CancelButton, MUIM_Notify, MUIA_Pressed, FALSE,
  320.             rc, 2, TMM_Finish, TMV_Finish_Cancel);
  321.  
  322.   } else
  323.  
  324.    /* Couldn't create object, free file name again */
  325.    FreeVector(file);
  326.  }
  327.  
  328.  MAINWINDOW_LOG(LOG1(Result, "0x%08lx", rc))
  329.  
  330.  /* Return pointer to created object */
  331.  return((ULONG) rc);
  332. }
  333.  
  334. /* MainWindow class method: OM_DISPOSE */
  335. #undef  DEBUGFUNCTION
  336. #define DEBUGFUNCTION MainWindowClassDispose
  337. static ULONG MainWindowClassDispose(Class *cl, Object *obj, Msg msg)
  338. {
  339.  struct MainWindowClassData *mwcd = TYPED_INST_DATA(cl, obj);
  340.  
  341.  MAINWINDOW_LOG(LOG1(Disposing, "0x%08lx", obj))
  342.  
  343.  /* Free default file name */
  344.  FreeVector(mwcd->mwcd_DefaultFile);
  345.  
  346.  /* Call SuperClass */
  347.  return(DoSuperMethodA(cl, obj, msg));
  348. }
  349.  
  350. /* MainWindow class method: TMM_Finish */
  351. #undef  DEBUGFUNCTION
  352. #define DEBUGFUNCTION MainWindowClassFinish
  353. static ULONG MainWindowClassFinish(Class *cl, Object *obj,
  354.                                    struct TMP_Finish *tmpf)
  355. {
  356.  struct MainWindowClassData *mwcd = TYPED_INST_DATA(cl, obj);
  357.  BOOL                        quit = FALSE;
  358.  
  359.  /* What type of close event? */
  360.  switch (tmpf->tmpf_Type) {
  361.   case TMV_Finish_Cancel:
  362.    /* Always quit, but check requesters first */
  363.    if (CheckRequesters(obj)) quit = TRUE;
  364.    break;
  365.  
  366.   case TMV_Finish_Use:
  367.    /* Write configuration to ENV: and quit if successful */
  368.    quit = CheckRequesters(obj) &&
  369.           WriteConfig(obj, mwcd->mwcd_Lists, ConfigUseName, FALSE);
  370.    break;
  371.  
  372.   case TMV_Finish_Test:
  373.    /* Write configuration to ENV: and DON'T quit! */
  374.    WriteConfig(obj, mwcd->mwcd_Lists, ConfigUseName, FALSE);
  375.    break;
  376.  
  377.   case TMV_Finish_Save:
  378.    /* Write configuration to ENVARC: and ENV: and quit if both successful */
  379.    quit = CheckRequesters(obj) &&
  380.           WriteConfig(obj, mwcd->mwcd_Lists, ConfigSaveName, FALSE) &&
  381.           WriteConfig(obj, mwcd->mwcd_Lists, ConfigUseName,  FALSE);
  382.    break;
  383.  }
  384.  
  385.  /* Quit? Send quit message to application */
  386.  if (quit) DoMethod(_app(obj), MUIM_Application_ReturnID,
  387.                     MUIV_Application_ReturnID_Quit);
  388.  
  389.  /* Return 1 to indicate that the method is implemented */
  390.  return(1);
  391. }
  392.  
  393. /* MainWindow class method: TMM_Load */
  394. #undef  DEBUGFUNCTION
  395. #define DEBUGFUNCTION MainWindowClassLoad
  396. static ULONG MainWindowClassLoad(Class *cl, Object *obj, struct TMP_Load *tmpl)
  397. {
  398.  MAINWINDOW_LOG(LOG2(File, "%s (0x%08lx)", tmpl->tmpl_File, tmpl->tmpl_File))
  399.  
  400.  /* Load configuration file */
  401.  ReadConfig(obj, TYPED_INST_DATA(cl,obj)->mwcd_Lists, TRUE, tmpl->tmpl_File);
  402.  
  403.  /* Return 1 to indicate that the method is implemented */
  404.  return(1);
  405. }
  406.  
  407. /* MainWindow class method: TMM_Menu */
  408. #undef  DEBUGFUNCTION
  409. #define DEBUGFUNCTION MainWindowClassMenu
  410. static ULONG MainWindowClassMenu(Class *cl, Object *obj, struct TMP_Menu *tmpm)
  411. {
  412.  struct MainWindowClassData *mwcd = TYPED_INST_DATA(cl, obj);
  413.  
  414.  MAINWINDOW_LOG(LOG1(UserData, "%ld", tmpm->tmpm_UserData))
  415.  
  416.  /* Which menu? */
  417.  switch (tmpm->tmpm_UserData) {
  418.   case MENUID_OPEN: {
  419.     const char *newname;
  420.  
  421.     /* Read configuration file using a file requester */
  422.     if (CheckRequesters(obj) &&
  423.         (newname = ReadConfigWithRequester(obj, mwcd->mwcd_Lists, TRUE,
  424.                                            mwcd->mwcd_DefaultFile))) {
  425.  
  426.      MAINWINDOW_LOG(LOG2(New Name, "%s (0x%08lx)", newname, newname))
  427.  
  428.      /* User has selected a new default file, free old name */
  429.      FreeVector(mwcd->mwcd_DefaultFile);
  430.  
  431.      /* Store pointer to new name */
  432.      mwcd->mwcd_DefaultFile = newname;
  433.     }
  434.    }
  435.    break;
  436.  
  437.   case MENUID_APPEND: {
  438.     const char *newname;
  439.  
  440.     /* Read configuration file using a file requester */
  441.     if (newname = ReadConfigWithRequester(obj, mwcd->mwcd_Lists, FALSE,
  442.                                           mwcd->mwcd_DefaultFile)) {
  443.  
  444.      MAINWINDOW_LOG(LOG2(New Name, "%s (0x%08lx)", newname, newname))
  445.  
  446.      /* User has selected a new default file, free old name */
  447.      FreeVector(mwcd->mwcd_DefaultFile);
  448.  
  449.      /* Store pointer to new name */
  450.      mwcd->mwcd_DefaultFile = newname;
  451.     }
  452.    }
  453.    break;
  454.  
  455.   case MENUID_SAVEAS: {
  456.     const char *newname;
  457.  
  458.     /* Write configuration file using a file requester */
  459.     if (newname = WriteConfigWithRequester(obj, mwcd->mwcd_Lists,
  460.                                            mwcd->mwcd_DefaultFile,
  461.                                            GetCheckitState(mwcd->mwcd_Icons,
  462.                                                            TRUE))) {
  463.  
  464.      MAINWINDOW_LOG(LOG2(New Name, "%s (0x%08lx)", newname, newname))
  465.  
  466.      /* User has selected a new default file, free old name */
  467.      FreeVector(mwcd->mwcd_DefaultFile);
  468.  
  469.      /* Store pointer to new name */
  470.      mwcd->mwcd_DefaultFile = newname;
  471.     }
  472.    }
  473.    break;
  474.  
  475.   case MENUID_CLIPBOARD: {
  476.     Object *win;
  477.  
  478.     /* Create new clipboard window */
  479.     if (win = NewObject(ClipWindowClass->mcc_Class, NULL, NULL)) {
  480.      ULONG opened;
  481.  
  482.      MAINWINDOW_LOG(LOG1(Clipboard window, "0x%08lx", win))
  483.  
  484.      /* Add window to application */
  485.      DoMethod(_app(obj), OM_ADDMEMBER, win);
  486.  
  487.      /* Open main window */
  488.      SetAttrs(win, MUIA_Window_Open, TRUE, TAG_DONE);
  489.  
  490.      /* Get window open status */
  491.      GetAttr(MUIA_Window_Open, win, &opened);
  492.  
  493.      /* Window open? */
  494.      if (opened == FALSE) {
  495.  
  496.       MAINWINDOW_LOG(LOG0(Could not open clipboard window))
  497.  
  498.       /* No, remove window from application */
  499.       DoMethod(_app(obj), OM_REMMEMBER, win);
  500.  
  501.       /* Dispose window */
  502.       MUI_DisposeObject(win);
  503.      }
  504.     }
  505.    }
  506.    break;
  507.  
  508.   case MENUID_ABOUT:
  509.    MUI_RequestA(_app(obj), obj, 0,
  510.                 TextGlobalTitle, TextGlobalCancel,
  511.                 MUIX_B MUIX_C "ToolManager " TMVERSION " (" __COMMODORE_DATE__
  512.                              ")\n\n"
  513.                 MUIX_N MUIX_C "© " TMCOPYRIGHTYEAR " Stefan Becker",
  514.                 NULL);
  515.    break;
  516.  
  517.   case MENUID_ABOUTMUI:
  518.    /* Send about message to application */
  519.    DoMethod(_app(obj), MUIM_Application_AboutMUI, obj);
  520.    break;
  521.  
  522.   case MENUID_QUIT:
  523.    /* Cancel main window */
  524.    DoMethod(obj, TMM_Finish, TMV_Finish_Cancel);
  525.    break;
  526.  
  527.   case MENUID_LASTSAVED:
  528.    if (CheckRequesters(obj)) ReadConfig(obj, mwcd->mwcd_Lists, TRUE,
  529.                                        ConfigSaveName);
  530.    break;
  531.  
  532.   case MENUID_RESTORE:
  533.    if (CheckRequesters(obj)) ReadConfig(obj, mwcd->mwcd_Lists, TRUE,
  534.                                        ConfigUseName);
  535.    break;
  536.  
  537.   case MENUID_GLOBAL:
  538.    OpenGlobalWindow(_app(obj));
  539.    break;
  540.  
  541.   case MENUID_MUI:
  542.    /* Send settings message to application */
  543.    DoMethod(_app(obj), MUIM_Application_OpenConfigWindow, 0);
  544.    break;
  545.  }
  546.  
  547.  /* Return 1 to indicate that the method is implemented */
  548.  return(1);
  549. }
  550.  
  551. /* MainWindow class method: TMM_AppEvent */
  552. #undef  DEBUGFUNCTION
  553. #define DEBUGFUNCTION MainWindowClassAppEvent
  554. static ULONG MainWindowClassAppEvent(Class *cl, Object *obj,
  555.                                      struct TMP_AppEvent *tmpae)
  556. {
  557.  struct MainWindowClassData *mwcd = TYPED_INST_DATA(cl, obj);
  558.  struct AppMessage          *am   = tmpae->tmpae_Message;
  559.  
  560.  MAINWINDOW_LOG(LOG2(Arguments, "Msg 0x%08lx Object 0x%08lx", am,
  561.                      tmpae->tmpae_Object))
  562.  
  563.  /* Is MainWindow the calling object? */
  564.  if (tmpae->tmpae_Object == obj) {
  565.   struct WBArg *wa;
  566.   ULONG         i;
  567.   ULONG         type;
  568.  
  569.   MAINWINDOW_LOG(LOG0(Icon dropped on ourself))
  570.  
  571.   /* Yes, get currently visible object list */
  572.   GetAttr(MUIA_Group_ActivePage, mwcd->mwcd_Register, &type);
  573.  
  574.   MAINWINDOW_LOG(LOG1(List type, "%ld", type))
  575.  
  576.   /* For each argument in the AppMessage */
  577.   for (i = am->am_NumArgs, wa = am->am_ArgList; i > 0; i--, wa++) {
  578.  
  579.    MAINWINDOW_LOG(LOG1(Next WBArg, "0x%08lx", wa))
  580.  
  581.    /* Send WBArg method to visible object list */
  582.    DoMethod(mwcd->mwcd_Lists[type], TMM_WBArg, wa, mwcd->mwcd_Lists);
  583.   }
  584.  
  585.  } else {
  586.  
  587.   MAINWINDOW_LOG(LOG1(Icon dropped on Object, "0x%08lx", tmpae->tmpae_Object))
  588.  
  589.   /* No, forward method to object */
  590.   DoMethod(tmpae->tmpae_Object, TMM_WBArg, am->am_ArgList, mwcd->mwcd_Lists);
  591.  }
  592.  
  593.  /* Return 1 to indicate that the method is implemented */
  594.  return(1);
  595. }
  596.  
  597. /* MainWindow class method dispatcher */
  598. #undef  DEBUGFUNCTION
  599. #define DEBUGFUNCTION MainWindowClassDispatcher
  600. __geta4 static ULONG MainWindowClassDispatcher(__a0 Class *cl,
  601.                                                __a2 Object *obj, __a1 Msg msg)
  602. {
  603.  ULONG rc;
  604.  
  605. #if DEBUG_VERY_NOISY
  606.  /* This just generates too much debug output... */
  607.  MAINWINDOW_LOG(LOG3(Arguments, "Class 0x%08lx Object 0x%08lx Msg 0x%08lx",
  608.                      cl, obj, msg))
  609. #endif
  610.  
  611.  switch(msg->MethodID) {
  612.   /* BOOPSI methods */
  613.   case OM_NEW:
  614.    rc = MainWindowClassNew(cl, obj, (struct opSet *) msg);
  615.    break;
  616.  
  617.   case OM_DISPOSE:
  618.    rc = MainWindowClassDispose(cl, obj, msg);
  619.    break;
  620.  
  621.   /* TM methods */
  622.   case TMM_Finish:
  623.    rc = MainWindowClassFinish(cl, obj, (struct TMP_Finish *) msg);
  624.    break;
  625.  
  626.   case TMM_Load:
  627.    rc = MainWindowClassLoad(cl, obj, (struct TMP_Load *) msg);
  628.    break;
  629.  
  630.   case TMM_Menu:
  631.    rc = MainWindowClassMenu(cl, obj, (struct TMP_Menu *) msg);
  632.    break;
  633.  
  634.   case TMM_AppEvent:
  635.    rc = MainWindowClassAppEvent(cl, obj, (struct TMP_AppEvent *) msg);
  636.    break;
  637.  
  638.   /* Unknown method -> delegate to SuperClass */
  639.   default:
  640.    rc = DoSuperMethodA(cl, obj, msg);
  641.    break;
  642.  }
  643.  
  644.  return(rc);
  645. }
  646.  
  647. /* Create MainWindow class */
  648. #undef  DEBUGFUNCTION
  649. #define DEBUGFUNCTION CreateMainWindowClass
  650. struct MUI_CustomClass *CreateMainWindowClass(void)
  651. {
  652.  struct MUI_CustomClass *rc;
  653.  
  654.  /* Create class */
  655.  if (rc = MUI_CreateCustomClass(NULL, MUIC_Window, NULL,
  656.                                 sizeof(struct MainWindowClassData),
  657.                                 MainWindowClassDispatcher)) {
  658.  
  659.   /* Localize strings */
  660.   TextObjects[TMOBJTYPE_EXEC]   = TranslateString(
  661.                                        LOCALE_TEXT_MAINWINDOW_TYPE_EXEC_STR,
  662.                                        LOCALE_TEXT_MAINWINDOW_TYPE_EXEC);
  663.   TextObjects[TMOBJTYPE_IMAGE]  = TranslateString(
  664.                                        LOCALE_TEXT_MAINWINDOW_TYPE_IMAGE_STR,
  665.                                        LOCALE_TEXT_MAINWINDOW_TYPE_IMAGE);
  666.   TextObjects[TMOBJTYPE_SOUND]  = TranslateString(
  667.                                        LOCALE_TEXT_MAINWINDOW_TYPE_SOUND_STR,
  668.                                        LOCALE_TEXT_MAINWINDOW_TYPE_SOUND);
  669.   TextObjects[TMOBJTYPE_MENU]   = TranslateString(
  670.                                        LOCALE_TEXT_MAINWINDOW_TYPE_MENU_STR,
  671.                                        LOCALE_TEXT_MAINWINDOW_TYPE_MENU);
  672.   TextObjects[TMOBJTYPE_ICON]   = TranslateString(
  673.                                        LOCALE_TEXT_MAINWINDOW_TYPE_ICON_STR,
  674.                                        LOCALE_TEXT_MAINWINDOW_TYPE_ICON);
  675.   TextObjects[TMOBJTYPE_DOCK]   = TextGlobalDock;
  676.   TextObjects[TMOBJTYPE_ACCESS] = TranslateString(
  677.                                        LOCALE_TEXT_MAINWINDOW_TYPE_ACCESS_STR,
  678.                                        LOCALE_TEXT_MAINWINDOW_TYPE_ACCESS);
  679.   TextObjects[TMOBJTYPES]       = NULL;
  680.  }
  681.  
  682.  MAINWINDOW_LOG(LOG1(Result, "0x%08lx", rc))
  683.  
  684.  return(rc);
  685. }
  686.